package com.hnust.service.impl;

import com.hnust.dao.CollegeAdminDao;
import com.hnust.dao.CourseDao;
import com.hnust.dao.CourseTargetDao;
import com.hnust.domain.CollegeAdmin;
import com.hnust.domain.Course;
import com.hnust.domain.record.CourseRecord;
import com.hnust.service.CourseService;
import com.hnust.util.GenerateId;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * 创建人：彭鑫淼
 * 创建时间：2020/10/5
 * 描述：课程管理模块service实现类
 */
@Service("courseService")
public class CourseServiceImpl implements CourseService {
    @Autowired
    CourseDao courseDao;

    @Autowired
    CollegeAdminDao collegeAdminDao;

    @Autowired
    CourseTargetDao courseTargetDao;

    /**
     * 获取所有课程
     * @param collegeId 学院Id
     * @param currentPage 当前页号
     * @param rows 每页显示数据数量
     * @return
     * @throws Exception
     */
    @Override
    public Map get( String collegeId, Integer currentPage, Integer rows) throws Exception {
        Map map=new HashMap();
        map.put("courseRecordList", courseDao.getCourse(collegeId, rows*(currentPage-1),rows ));
        map.put("count", courseDao.getCourseNum(collegeId));
        return map;
    }

    /**
     * 根据课程名查询课程
     * @param collegeId 学院Id
     * @param courseName 课程名
     * @param currentPage 当前页号
     * @param rows 每页显示数据数量
     * @return
     * @throws Exception
     */
    @Override
    public Map query( String collegeId, String courseName, Integer currentPage, Integer rows) throws Exception {
        Map map=new HashMap();
        map.put("courseRecordList", courseDao.queryCourse(collegeId,courseName,rows*(currentPage-1),rows));
        map.put("count", courseDao.queryCourseCount(collegeId, courseName));
        return map;
    }

    /**
     * 添加课程
     * @param account 管理员Id
     * @param courseRecord 课程信息
     * @return
     * @throws Exception
     */
    @Override
    public Boolean add( String account,CourseRecord courseRecord) throws Exception {
        Course course=new Course();
        course.setCouId(GenerateId.create());
        course.setName(courseRecord.getName());
        course.setCouNumber(courseRecord.getCode());
        //根据管理员Id获取所在学院Id
        course.setColId(collegeAdminDao.getCollegeIdByAdminAccount(account));
        Boolean result=courseDao.addCourse(course);
        return result;
    }

    /**
     * 删除课程
     * @param courseIds 课程Id（数组类型、字符串类型）
     * @return
     * @throws Exception
     */
    @Override
    public <T> Boolean delete(T courseIds) throws Exception {
        //根据传入的courseIds进行类型判断
        if (courseIds instanceof String){
            courseTargetDao.deleteCouTarByCouId((String)courseIds);
            return courseDao.deleteCourse((String) courseIds);
        }else{
            for (String courseId : (List<String>)courseIds){
                Boolean res1 = courseTargetDao.deleteCouTarByCouId(courseId);
                Boolean res2 =courseDao.deleteCourse(courseId);
                if(!(res1&res2)){
                    return false;
                }
            }
        }
        return true;
    }

    /**
     * 修改课程
     * @param courseRecord 课程信息
     * @return
     * @throws Exception
     */
    @Override
    public Boolean modify(CourseRecord courseRecord) throws Exception {
        Boolean result=courseDao.modifyCourse(courseRecord);
        return result;
    }
    //TODO 文件下载
    @Override
    public void download() throws Exception {

    }
    //TODO 文件上传
    @Override
    public List<CourseRecord> upload(File file) throws Exception {
        return null;
    }

    /**
     * 批量导入课程信息
     * @param account 管理员Id
     * @param courseRecords 课程信息列表
     * @return
     * @throws Exception
     */
    @Override
    public Boolean course(String account,List<CourseRecord> courseRecords) throws Exception {
        Course course=new Course();
        for (CourseRecord courseRecord : courseRecords){
            course.setCouId(GenerateId.create());
            course.setName(courseRecord.getName());
            course.setCouNumber(courseRecord.getCode());
            //根据管理员Id，获取管理员所在学院Id
            course.setColId(collegeAdminDao.getCollegeIdByAdminAccount(account));
            Boolean result=courseDao.addCourse(course);
            if(result==false){
                return false;
            }
        }
        return true;
    }

}
